//
// Created by Jisam on 2024/8/11 23:29.
// solve e
#include <bits/stdc++.h>

#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>

#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;

using namespace std;


// 解决方案函数，用于处理特定的逻辑
void solve() {
    // 输入整数n，代表需要处理的操作数量
    int n;
    cin >> n;
    // 定义一个存储对的向量stk，用于记录每种操作的最后使用时间和长度
    vector<pair<int, i64>> stk;
    // 定义变量ans，用于累计操作结果
    i64 ans = 0;

    // 循环n次，每次读取并处理输入的操作
    for (int i = 0; i < n; i++) {
        // 读取当前操作的两个参数a和b
        int a, b;
        cin >> a >> b;
        // 定义变量len，用于计算当前操作处理的总长度
        i64 len = 0;
        // 当栈不为空且满足特定条件时，进行循环处理
        while (!stk.empty() && (a > 0 || stk.back().first == b)) {
            // 如果栈顶的操作类型与当前操作类型b相同，则累加长度并移除栈顶
            if (stk.back().first == b) {
                len += stk.back().second;
                stk.pop_back();
            } else {
                // 否则，计算当前操作a和栈顶长度的最小值，进行处理
                i64 t = min<i64>(a, stk.back().second);
                a -= t;
                len += t;
                // 更新栈顶长度，并在长度为0时移除栈顶
                stk.back().second -= t;
                if (stk.back().second == 0) {
                    stk.pop_back();
                }
            }

        }
        // 累加当前操作未处理完的部分到结果ans中
        ans += a;
        // 更新当前操作的总长度
        len += a;
        // 将当前操作的类型b和处理总长度添加到栈中
        stk.emplace_back(b, len);
        // 根据是否是最后一次操作，决定是否换行输出结果ans
        cout << ans << " \n"[i == n - 1];
    }

}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
    cin >> T;
    while (T--) solve();
//    cout << "\n"[];
    return 0;
}